Breakが付いたUnitySublimeSocketAsset 0.6.1


概要

予定していた、ゲーム内パラメータをエディタで見る機能と、

Break(特定行でゲーム中断)という機能が、試験的に実装できた。

ホントホント。エイプリルフールだけど。


・ゲーム中のその瞬間のパラメータが見れる

Debug.Log("L行番号:ファイル名: ほか

Logの延長上で、ゲーム実行中の値が、エディタから見れるようになった。


・ゲーム中に特定の箇所でBreakが出来る

Debug.Log("B行番号:ファイル名: ほか

やはりLogの延長上で、特定Logが再生された瞬間、

無理矢理フォーカスをUnityから別アプリ(SublimeTextとか)へと移動する事で、

ゲームの挙動を停止させる。


その時の値も見れる。

スクリーンショット 2013-04-01 20.03.14.png



ムービー

https://vimeo.com/63078739



どうやってるのか

Unityで実行するLogに対して、特定フォーマットのものが発生したら、


UnitySublimeSocketがSublimeSocketへとデータ転送

→SublimeSocketが反応、値を保持

という事をしてるだけ。

設定には、SublimeSocketのAPIを使って、


->defineFilter: 

{

    "name": "unity",

    "patterns": [

        {

            "(.*)[(]([0-9].*?),.*[)]: error .*:(.*)": {

                "selectors": [

                    {

                        "showAtLog": {

                            "message": "groups[0]"

                        }

                    },

                    {

                        "appendRegion": {

                            "line": "groups[2]",

                            "message": "\"groups[3]\"",

                            "view": "groups[1]",

                            "condition": "keyword"

                        }

                    }

                ]

            }

        },

(中略)

        {

            "^L([0-9].*):(.*): (.*)": {

                "selectors": [

                    {

                        "appendRegion": {

                            "line": "groups[1]",

                            "message": "groups[3]",

                            "view": "groups[2]",

                            "condition": "string"

                        }

                    }

                ]

            }

        },

        {

            "^B([0-9].*):(.*): (.*)": {

                "selectors": [

                    {

                        "showStatusMessage": {

                            "message": "groups[2] break. line:groups[1], groups[3]"

                        }

                    },

                    {

                        "showAtLog": {

                            "message": "groups[2] break. line:groups[1], groups[3]"

                        }

                    },

                    {

                        "appendRegion": {

                            "line": "groups[1]",

                            "message": "groups[3]",

                            "view": "groups[2]",

                            "condition": "string"

                        }

                    },

                    {

                        "monocastMessage": {

                            "target": "unitysocket",

                            "message": "break"

                        }

                    }

                ]

            }

        }

    ]

}

正規表現に対して、特定のAPIを着火するようにしかけてあるだけ。


いやーAPIつくって良かったわー。


だいたいのことがカスタマイズできる。

思いつきで挙動変えられる。



まだ本決まりでないBreak

理屈は恐ろしく下らないものなので、お判りの通り、これは正しいBreakではない。

大体、Breakっつったら順に実行できたりしないとつまらないだろう。


今後、気が向いたらなんとかすると思う。

具体的にはコレ用のライブラリを書いて、Asset側で停止や次へ、を扱う。


行単位実行は、、たぶんやらない。行単位でBreak置いてください的な。


目指しているもの

本来、SublimeSocketは、Unity用では無く、Scalaとかをサーバサイドでコンパイルして、

そのコンパイル中継やパラメータの流れをクライアント=SublimeText側で受けることを目的としたものだった。

ライブコンパイル用のBufferも、WebSocketを基礎にした設計もその辺が根源にある。


なので、本来の用途じゃないけど、

なかなか、Unityとの連携は面白いなーと思っているところ。



そろそろAssetStoreに出す。出したい。誰かデバッグしてくれる人、追加で募集中。



関係ないけど

SublimeTextの設計思想、メイン機構はC++、プラグインはPythonで、っていうのが、

ほんともう素晴らしい。


プラグインはコンパイル無しの言語でサクサク書き、信頼が必要だったり頑強さが求められる部分や、テストは静的解析とかコンパイルできる言語で書くと

ほんとに良いと思う。


静的だけだとめんどい。 他に得に不満は無い。Scalaとか高機能な言語を使えば良い。

動的だけだとバグる。 テストの量がネックになる。 いつでも型を気にしないといけない。


この組み合わせは、とてもいい。

いやー捗るわー。



あっほら、4/1だから、アジだよ。